﻿using ExcellentProjectPlus.Aplicacion.Cuestionarios.Cuestionarios;
using ExcellentProjectPlus.Dominio.Examenes.Entidades;
using ExcellentProjectPlus.Dominio.Examenes.Servicios.Calendarizaciones;
using ExcellentProjectPlus.Dominio.Examenes.Servicios.Examenes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Examenes.Examenes
{
    public class ServicioDeGestionDeExamenes
          : IServicioDeGestionDeExamenes
    {
        #region Propiedades
        IServicioDeAdministracionDeExamenes _servicioDeAdministracionDeExamenes;
        IServicioDeGestionDeCuestionarios _servicioDeGestionDeCuestionarios;
        #endregion

        #region Constructores
        public ServicioDeGestionDeExamenes(IServicioDeAdministracionDeExamenes servicioDeAdministracionDeExamenes,
            IServicioDeGestionDeCuestionarios servicioDeGestionDeCuestionarios)
        {
            _servicioDeAdministracionDeExamenes = servicioDeAdministracionDeExamenes;
            _servicioDeGestionDeCuestionarios = servicioDeGestionDeCuestionarios;
        }
        #endregion
        public IEnumerable<Examen> ObtenerExamenes()
        {
            IEnumerable<Examen> resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadUncommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeExamenes.ObtenerExamen();
                transaccion.Complete();
            }

            return resultado;
        }
       

        public Examen ObtenerExamenPorId(int id)
        {
            Examen resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeExamenes.ObtenerExamenPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarExamen(Examen examen)
        {
            _servicioDeAdministracionDeExamenes.AgregarExamen(examen);
        }

        public void ModificarExamen(Examen examen)
        {
            _servicioDeAdministracionDeExamenes.ModificarExamen(examen);
        }

        public void EliminarExamen(Examen examen)
        {
            _servicioDeAdministracionDeExamenes.EliminarExamen(examen);
        }


        public void Dispose()
        {
            throw new NotImplementedException();
        }


        public IEnumerable<Examen> ObtenerExamenesPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDeExamenes.ObtenerExamenesPaginado(pagina, tamanio);
        }

        public decimal CalificarExamen(int idExamen, dynamic respuestas)
        {
            var examen = _servicioDeAdministracionDeExamenes.ObtenerExamenPorId(idExamen);

            if (examen == null)
                throw new InvalidOperationException("No se encuentra el examen :" + idExamen);

            //Obtencion de la platilla de calificacion
            var cuestionario = _servicioDeGestionDeCuestionarios.ObtenerCuestionarioPorId(examen.IdCuestionario);
            return _servicioDeAdministracionDeExamenes.CalificarExamen(examen, cuestionario, respuestas);
        }


        public IQueryable<Examen> ObtenerExamenesRendidosPorEstudiante(int idEstudiante)
        {
            IQueryable<Examen> resultado = null;

            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeExamenes.ObtenerExamenesRendidosPorEstudiante(idEstudiante);
                transaccion.Complete();
            }
            return resultado;
        }
    }
}

